home *** CD-ROM | disk | FTP | other *** search
- ⓪ IMPLEMENTATION MODULE FastGEM0;(*Y+*)⓪ ⓪ ⓪ (* --------------------------------------------------------------------------⓪!* System-Version: MOS 1.1⓪!* --------------------------------------------------------------------------⓪!* Version : 0.01⓪!* --------------------------------------------------------------------------⓪!* Text-Version : V#0008⓪!* --------------------------------------------------------------------------⓪!* Modul-Holder : Manuel Chakravarty⓪!* --------------------------------------------------------------------------⓪!* Copyright July 1988 by Manuel Chakravarty⓪!* Vertriebsrechte für ATARI ST unter MEGAMAX Modula-2⓪!* liegen bei Application Systems Heidelberg⓪!* --------------------------------------------------------------------------⓪!* MCH : Manuel Chakravarty⓪!* --------------------------------------------------------------------------⓪!* Datum Autor Version Bemerkung (Arbeitsbericht)⓪!*⓪!* 14.08.89 MCH V0.01 Urversion; 'CopyOpaque' impl. + def.⓪!* --------------------------------------------------------------------------⓪!* Modul-Beschreibung:⓪!*⓪!* Dies Modul stellt eine schnelle Kopierfunktion für beliebige Bildschirm-⓪!* bereiche zur Verfügung.⓪!*⓪!* --------------------------------------------------------------------------⓪!*)⓪ ⓪ (* =========== ZU TUN: ==============⓪!*⓪!* -- Überprüfen, ob die Routinen immer VDI aufrufen, wenn die ASM-Routine⓪!* versagt.⓪!*⓪!* =========== DOCU: ================⓪!*⓪!*)⓪ ⓪ ⓪ FROM SYSTEM IMPORT ASSEMBLER, BYTE, ADDRESS;⓪ ⓪ FROM GrafBase IMPORT Rectangle, BitOperation, PtrMemFormDef, MemFormDef,⓪7GetBlitterMode, GetScreen;⓪ ⓪ FROM GEMEnv IMPORT DeviceHandle;⓪ ⓪ IMPORT VDIRasters;⓪ ⓪ ⓪ TABLE.W masks: $FFFF, $7FFF, $3FFF, $1FFF, (* Tabelle für 'copyOpaque' *)⓪0$0FFF, $07FF, $03FF, $01FF,⓪0$00FF, $007F, $003F, $001F,⓪0$000F, $0007, $0003, $0001;⓪0⓪((* wortbreite, planes *) (* Bildschirmauflösungen *)⓪(⓪(rez: 80, 4, (* Low-Res *)⓪180, 2, (* Mid-Res *)⓪140, 1; (* High-Res *)⓪(⓪ PROCEDURE CopyOpaque (dev : DeviceHandle;⓪6sourceMem,⓪6destMem : PtrMemFormDef;⓪6sourceFrame,⓪6destFrame : Rectangle;⓪6mode : BitOperation);⓪6⓪"VAR screenAddr : ADDRESS;⓪(words, planes : CARDINAL;⓪(wordAlign : BYTE;⓪ ⓪"PROCEDURE longCopy;⓪"⓪$(*$L-*)⓪$BEGIN⓪&ASSEMBLER⓪(TST.W sourceFrame.w(A6)⓪(BPL ok1⓪(CLR.W sourceFrame.w(A6)⓪ ok1⓪(TST.W sourceFrame.h(A6)⓪(BPL ok2⓪(CLR.W sourceFrame.h(A6)⓪ ok2⓪ ⓪(MOVEM.L D3-D7/A3-A5,-(A7)⓪(⓪(MOVE.W planes(A6),A3 ; Anzahl Randwörter links -> A3⓪(MOVE.W A3,A4 ; Anzahl Randwörter rechts -> A4⓪(⓪(MOVE.W sourceFrame.x(A6),D0⓪(MOVE.W D0,D2⓪(ANDI.W #$F,D0⓪(MOVE.W #16,D7⓪(SUB.W D0,D7⓪(MOVE.W D7,-(A7) ; Anzahl linke Randbits merken (Stack)⓪(ADD.W D0,D0⓪(LEA masks,A0⓪(MOVE.L A0,A1⓪(ADDA.W D0,A0⓪(MOVE.W (A0),D1 ; Linke Kopiermaske -> D1⓪(MOVE.W D1,D3⓪(NOT.W D3 ; Linke negierte Kopiermaske -> D3⓪(⓪(ADD.W sourceFrame.w(A6),D2⓪(ANDI.W #$F,D2⓪(MOVE.W D2,-(A7) ; Anzahl rechte Randbits merken (Stack)⓪(ADD.W D2,D2⓪(ADDA.W D2,A1⓪(MOVE.W (A1),D4 ; Rechte negierte Kopiermaske -> D4⓪(MOVE.W D4,D2⓪(NOT.W D2 ; Rechte Kopiermaske -> D2⓪(BNE c⓪(CLR.W (A7) ; Keine rechten Randbits merken⓪(MOVE.W #0,A4 ; Rechts ist Wortgrenze => Keine Maske nötig⓪ c⓪(⓪(MOVE.W sourceFrame.w(A6),D0⓪(SUB.W (A7)+,D0 ; Randbits abziehen⓪(SUB.W (A7)+,D0⓪(BPL c2⓪(AND.W D2,D1⓪(OR.W D4,D3⓪(MOVE.W #0,A4⓪(CLR.W D0⓪ c2⓪(LSR.W #4,D0⓪(MULU.W planes(A6),D0⓪(MOVE.W D0,D7⓪(ADD.W A3,D7⓪(ADD.W A4,D7⓪(MOVE.W words(A6),A5⓪(SUBA.W D7,A5⓪(ADDA.W A5,A5 ; Zeilenoffset in Byte -> A5⓪(MOVE.W D7,-(A7) ; Anzahl pro Zeile zu kopierende Words -> Stack⓪(LSR.W #1,D0⓪(SCS wordAlign(A6) ; wordAlign-Flag -> 'wordAlign'⓪(MOVE.W D0,A2 ; Anzahl Longs pro Zeile -> A2⓪(⓪(MOVE.W sourceFrame.h(A6),D5 ; Anzahl Zeilen -> D5⓪(⓪(; Startaddressenberechnung⓪(⓪(MOVE.W sourceFrame.y(A6),D0⓪(MULU.W words(A6),D0⓪(ADD.W D0,D0⓪(MOVEQ #0,D7⓪(MOVE.L D7,A0⓪(MOVE.W D0,A0⓪(MOVE.W sourceFrame.x(A6),D0⓪(LSR.W #3,D0⓪(AND.W #$FE,D0⓪(ADDA.W D0,A0⓪(ADDA.L screenAddr(A6),A0 ; sourceAddr -> A0⓪(⓪(MOVE.W destFrame.y(A6),D0⓪(MULU.W words(A6),D0⓪(ADD.W D0,D0⓪(MOVEQ #0,D7⓪(MOVE.L D7,A1⓪(MOVE.W D0,A1⓪(MOVE.W destFrame.x(A6),D0⓪(LSR.W #3,D0⓪(AND.W #$FE,D0⓪(ADDA.W D0,A1⓪(ADDA.L screenAddr(A6),A1 ; destAddr -> A1⓪(⓪(CMPA.L A0,A1⓪(BCS.W forward⓪(⓪(; --- Kopie RÜCKWÄRTS ---⓪(⓪(MOVE.W sourceFrame.h(A6),D0⓪(SUBQ.W #1,D0⓪(MULU.W words(A6),D0⓪(ADD.W (A7)+,D0 ; Anzahl zu kopierende Wörter pro Zeile add.⓪(ADD.W D0,D0⓪(ADDA.W D0,A0⓪(ADDA.W D0,A1⓪(⓪(BRA startBack ; Start Kopierschleife (rückwärts)⓪ lBack⓪(MOVE.W A4,D0 ; Start rechte Maske⓪(BRA sBRight⓪ lBRight⓪(MOVE.W -(A1),D6⓪(AND.W D4,D6⓪(MOVE.W -(A0),D7⓪(AND.W D2,D7⓪(OR.W D6,D7⓪(MOVE.W D7,(A1)⓪ sBRight⓪(DBF D0,lBRight⓪(⓪(TST.B wordAlign(A6) ; Start Align⓪(BEQ noAlignB⓪(MOVE.W -(A0),-(A1)⓪ noAlignB⓪ ⓪(MOVE.W A2,D0 ; Start kopiere Longs⓪(BRA sBLongs⓪ lBLongs⓪(MOVE.L -(A0),-(A1)⓪ sBLongs⓪(DBF D0,lBLongs⓪(⓪(MOVE.W A3,D0 ; Start linke Maske⓪(BRA sBLeft⓪ lBLeft⓪(MOVE.W -(A1),D6⓪(AND.W D3,D6⓪(MOVE.W -(A0),D7⓪(AND.W D1,D7⓪(OR.W D6,D7⓪(MOVE.W D7,(A1)⓪ sBLeft⓪(DBF D0,lBLeft⓪ ⓪(SUBA.W A5,A0 ; Addr. der nächsten Zeile ermittlen⓪(SUBA.W A5,A1⓪ startBack⓪(DBF D5,lBack⓪(⓪(BRA ende⓪(⓪(; --- Kopie VORWÄRTS ---⓪(⓪ forward⓪(ADDQ.L #2,A7 ; A7 bereinigen⓪(BRA startFore ; Start Kopierschleife (vorwärts)⓪ lFore⓪(MOVE.W A3,D0 ; Start linke Maske⓪(BRA sFLeft⓪ lFLeft⓪(MOVE.W (A1),D6⓪(AND.W D3,D6⓪(MOVE.W (A0)+,D7⓪(AND.W D1,D7⓪(OR.W D6,D7⓪(MOVE.W D7,(A1)+⓪ sFLeft⓪(DBF D0,lFLeft⓪(⓪(TST.B wordAlign(A6) ; Start Align⓪(BEQ noAlignF⓪(MOVE.W (A0)+,(A1)+⓪ noAlignF⓪ ⓪(MOVE.W A2,D0 ; Start kopiere Longs⓪(BRA sFLongs⓪ lFLongs⓪(MOVE.L (A0)+,(A1)+⓪ sFLongs⓪(DBF D0,lFLongs⓪(⓪(MOVE.W A4,D0 ; Start linke Maske⓪(BRA sFRight⓪ lFRight⓪(MOVE.W (A1),D6⓪(AND.W D4,D6⓪(MOVE.W (A0)+,D7⓪(AND.W D2,D7⓪(OR.W D6,D7⓪(MOVE.W D7,(A1)+⓪ sFRight⓪(DBF D0,lFRight⓪ ⓪(ADDA.W A5,A0 ; Addr. der nächsten Zeile ermittlen⓪(ADDA.W A5,A1⓪ startFore⓪(DBF D5,lFore⓪(⓪ ende⓪(MOVEM.L (A7)+,D3-D7/A3-A5⓪&END;⓪$END longCopy;⓪$(*$L=*)⓪ ⓪"BEGIN⓪$ASSEMBLER⓪(SUBQ.L #2,A7⓪(MOVE.L A7,(A3)+⓪(SUBQ.L #2,A7⓪(MOVE.L A7,(A3)+⓪(JSR GetBlitterMode⓪(MOVE.W (A7)+,D0⓪(AND.W (A7)+,D0⓪(BNE vdiCopy ; Springe, falls Blitter vorhanden + aktiv⓪(⓪(MOVE.W mode(A6),D0⓪(CMP.W #onlyS,D0⓪(BNE vdiCopy ; Springe, falls kein replace-mode⓪(⓪(MOVE.L sourceMem(A6),A0⓪(MOVE.L MemFormDef.start(A0),D0⓪(MOVE.L destMem(A6),A0⓪(CMP.L MemFormDef.start(A0),D0⓪(BEQ cont⓪#⓪ vdiCopy⓪$END;⓪$VDIRasters.CopyOpaque (dev, sourceMem,destMem, sourceFrame, destFrame,⓪;mode);⓪$ASSEMBLER⓪(BRA ende⓪"⓪ cont⓪(TST.L D0⓪(BNE mfdbValid⓪(⓪(; Bildschirmaddresse und die Breite einer Scanzeile ermitteln⓪(⓪(SUBQ.L #4,A7⓪(MOVE.L A7,(A3)+⓪(SUBQ.L #4,A7⓪(MOVE.L A7,(A3)+⓪(SUBQ.L #2,A7⓪(MOVE.L A7,(A3)+⓪(JSR GetScreen⓪(⓪(MOVE.W (A7)+,D0⓪(LSL.W #2,D0⓪(LEA rez,A0⓪(ADDA.W D0,A0⓪(MOVE.W (A0)+,words(A6)⓪(MOVE.W (A0),planes(A6)⓪(ADDQ.L #4,A7⓪(MOVE.L (A7)+,screenAddr(A6)⓪(BRA cont3⓪(⓪(; Werte aus MFDB übernehmen⓪(⓪ mfdbValid⓪(MOVE.L D0,screenAddr(A6)⓪(MOVE.W MemFormDef.words(A0),words(A6)⓪(MOVE.W MemFormDef.planes(A0),planes(A6)⓪(⓪ cont3⓪(MOVE.W sourceFrame.x(A6),D0⓪(ANDI.W #$F,D0⓪(MOVE.W destFrame.x(A6),D1⓪(ANDI.W #$F,D1⓪(CMP.W D0,D1⓪(BNE vdiCopy⓪(CMPI.W #1,planes(A6)⓪(BNE vdiCopy⓪(BSR longCopy⓪(⓪ ende⓪$END;⓪"END CopyOpaque;⓪ ⓪ ⓪ END FastGEM0.⓪ ə
- (* $FFEC9B95$FFEC9B95$FFEC9B95$FFEC9B95$FFEC9B95$FFEC9B95$FFEC9B95$FFEC9B95$FFEC9B95$FFEC9B95$FFEC9B95$FFEC9B95$FFEC9B95$FFEC9B95$FFEC9B95$00001CBF$FFEC9B95$FFEC9B95$FFEC9B95$FFEC9B95$FFEC9B95$FFEC9B95$FFEC9B95$FFEC9B95$FFEC9B95$FFEC9B95$FFEC9B95$FFEC9B95$FFEC9B95$FFEC9B95$FFEC9B95$FFEC9B95$FFEC9B95$FFEC9B95$FFEC9B95$FFEC9B95$FFEC9B95$FFEC9B95$FFEC9B95$FFEC9B95$FFEC9B95$FFEC9B95ü$00000027T.......T.......T.......T.......T.......T.......T.......T.......T.......T.......$000006B7$00001CAF$000006FA$00000020$FFEC88E0$00002066$0000063D$000005E1$00000027$00002056$00002043$00000703$00000885$00000896$000006FA$0000064BñÇâ*)
-